home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_200 / 272_01 / gtod.c < prev    next >
Text File  |  1987-03-28  |  7KB  |  231 lines

  1. /*
  2. **                GET TIME OF DAY UTILITY
  3. **
  4. ** S.E. Margison  Copyright 1986  All rights reserved
  5. ** 9-18-86 A  V1.01  Datalight C
  6. **
  7. **  Options default to date, time, 12 hour format, no seconds, American
  8. **          style reporting.  Either - or / used for options, or none.
  9. **  -d   report (D)ate only
  10. **  -t   report (T)ime only
  11. **  -s   report (S)econds (only if -t option used)
  12. **  -l   Report date in (L)ong format
  13. **  -n   Include the (N)ame of the weekday, if -l format
  14. **  -m   report time in (M)ilitary format (12 hour format if not used)
  15. **  -e   report date in (E)uropean format
  16. **  -r   for time and date reporting, (R)everse order to time first
  17. **  If any options are used, no default values are assumed.
  18. **  No options is the same as -dt
  19. **
  20. **   As distributed, this program requires (for compilation):
  21. **     "Steve's Datalight Library" version 1.10 or later
  22. **   which may be obtained without registration from many Bulletin
  23. **   Board Systems including:
  24. **      Compuserve IBMSW
  25. **      Cul-De-Sac (Holliston, MA.)
  26. **      HAL-PC BBS (Houston, TX.)
  27. **   and software library houses including:
  28. **      Public (Software) Library (Houston, TX.)
  29. **
  30. **   or by registration:
  31. **      $10 for Docs, Small Model Library
  32. **      $25 for Docs, S, D, L, P libraries, and complete library source
  33. **              in C and Assembler
  34. **     Steven E. Margison
  35. **     124 Sixth Street
  36. **     Downers Grove, IL, 60515
  37. **
  38. */
  39.  
  40. #include <stdio.h>
  41. #include <time.h>
  42. #include <smdefs.h>
  43.  
  44. int nf, tf, df, sf, mf, rf, ef, lf;   /* option flags */
  45.  
  46. char datestr[64],   /* place for formatted date string */
  47.      timestr[16];   /* place for formatted time sring */
  48.  
  49. extern char *wkdayname();
  50. extern char *monthis();
  51.  
  52. struct tm *ptm;
  53. long clockval;
  54.  
  55. main(argc, argv)
  56. int argc;
  57. char *argv[];
  58. {
  59.  
  60.     /* first thing to do is read the clock! */
  61.  
  62.    clockval = time(0);
  63.    ptm = localtime(&clockval);
  64.  
  65.    doargs(argc, argv);  /* parse any options */
  66.  
  67.    if(!tf && !df) tf = df = YES;
  68.  
  69.    if(!tf) timestr[0] = NULL;   /* skip the time */
  70.    else mktime();
  71.  
  72.    if(!df) datestr[0] = NULL;   /* skip the date */
  73.    else mkdate();
  74.  
  75.    if(!rf) printf("%s  %s\n", datestr, timestr);
  76.    else printf("%s  %s\n", timestr, datestr);
  77. }
  78.  
  79. doargs(argc, argv)
  80. int argc;
  81. char *argv[];
  82. {
  83.    int i;
  84.    nf = tf = df = sf = mf = rf = ef = lf = NO;
  85.    while(--argc > 0) {
  86.       i = 0;
  87.       while(argv[argc][i] != NULL) {
  88.          switch(tolower(argv[argc][i++])) {
  89.             case '-': case '/':
  90.                break;
  91.             case 'n':
  92.                nf = YES;
  93.                break;
  94.             case 'd':
  95.                df = YES;
  96.                break;
  97.             case 't':
  98.                tf = YES;
  99.                break;
  100.             case 's':
  101.                sf = YES;
  102.                break;
  103.             case 'm':
  104.                mf = YES;
  105.                break;
  106.             case 'r':
  107.                rf = YES;
  108.                break;
  109.             case 'e':
  110.                ef = YES;
  111.                break;
  112.             case 'l':
  113.                lf = YES;
  114.                break;
  115.             case 'v':
  116.                fputs("GTOD Version 1.02\n", stderr);
  117.                fputs("GTOD ? for usage message\n", stderr);
  118.                error("Copyright 1986 S.E. Margison");
  119.             case '?':
  120.                usage();
  121.             default:
  122.                fputc(argv[argc][--i], stderr);
  123.                error(": invalid option");
  124.             }  /* end of switch */
  125.          } /* end of inner while */
  126.       }  /* end of outer while */
  127.    }
  128.  
  129. mkdate()
  130. {
  131.    int i, mpos, dpos;
  132.    char *mstr, dstr[6];
  133.    mpos = 0;
  134.    dpos = 3;
  135.    if(lf) {
  136.       dstr[0] = (ptm->tm_mday / 10) | '0';
  137.       if(dstr[0] == '0') dstr[0] = ' ';
  138.       dstr[1] = (ptm->tm_mday % 10) | '0';
  139.       dstr[2] = NULL;
  140.       if(nf) {
  141.          i = weekday(ptm->tm_mon+1, ptm->tm_mday, ptm->tm_year+1900);
  142.          mstr = wkdayname(i);
  143.          strcpy(datestr, mstr);
  144.          strcat(datestr, ", ");
  145.          }
  146.       mstr = monthis(ptm->tm_mon);
  147.       if(ef) {
  148.          strcat(datestr, dstr);
  149.          strcat(datestr, " ");
  150.          strcat(datestr, mstr);
  151.          }
  152.       else {
  153.          strcat(datestr, mstr);
  154.          strcat(datestr, " ");
  155.          strcat(datestr, dstr);
  156.          }
  157.       strcat(datestr, ", ");
  158.       i_dstr(dstr, ptm->tm_year+1900);
  159.       strcat(datestr, dstr);
  160.       return;
  161.       }
  162.  
  163.    if(ef) { mpos = 3; dpos = 0; }
  164.  
  165.    ptm->tm_mon++;      /* Datalight calls month 0 = January */
  166.    datestr[mpos++] = (ptm->tm_mon / 10) | '0';
  167.    datestr[mpos] = (ptm->tm_mon % 10) | '0';
  168.    datestr[2] = datestr[5] = '/';
  169.    datestr[dpos++] = (ptm->tm_mday / 10) | '0';
  170.    datestr[dpos] = (ptm->tm_mday % 10) | '0';
  171.    i = ptm->tm_year;
  172.    if(i > 100) i -= 100;
  173.    datestr[6] = (i / 10) | '0';
  174.    datestr[7] = (i % 10) | '0';
  175.    datestr[8] = NULL;
  176.    }
  177.  
  178. mktime()
  179. {
  180.    int hrs, eos;
  181.    timestr[2] = ':';
  182.    timestr[3] = (ptm->tm_min / 10) | '0';
  183.    timestr[4] = (ptm->tm_min % 10) | '0';
  184.    if(sf) {
  185.       timestr[5] = ':';
  186.       timestr[6] = (ptm->tm_sec / 10) | '0';
  187.       timestr[7] = (ptm->tm_sec % 10) | '0';
  188.       eos = 8;
  189.       }
  190.    else eos = 5;
  191.    if(mf) {
  192.       timestr[0] = (ptm->tm_hour / 10) | '0';
  193.       timestr[1] = (ptm->tm_hour % 10) | '0';
  194.       timestr[eos] = NULL;
  195.       }
  196.    else {
  197.       timestr[eos++] = ' ';
  198.       timestr[eos] = 'A';
  199.  
  200.       if(ptm->tm_hour >= 12) timestr[eos] = 'P';  /* set PM */
  201.  
  202.       if(ptm->tm_hour > 12) hrs = ptm->tm_hour - 12;
  203.       else if(ptm->tm_hour == 0) hrs = 12;   /* midnight = 12AM */
  204.       else hrs = ptm->tm_hour;
  205.  
  206.       timestr[++eos] = 'M';
  207.       timestr[++eos] = NULL;
  208.       timestr[0] = (hrs / 10) | '0';
  209.       timestr[1] = (hrs % 10) | '0';
  210.       if(timestr[0] == '0') timestr[0] = ' ';
  211.       }
  212.    }
  213.  
  214. usage() {
  215. puts("GTOD <options> or <-options> or </options>");
  216. puts("redirect stdout as desired");
  217. puts("d   report (D)ate only");
  218. puts("t   report (T)ime only");
  219. puts("s   report (S)econds (only if time is enabled)");
  220. puts("l   Report date in (L)ong format  (September 10, 1986)");
  221. puts("n   Include the (N)ame of the weekday, if -l format");
  222. puts("m   report time in (M)ilitary format (else, 12 hour format with AM/PM)");
  223. puts("e   report date in (E)uropean format  (DD/MM/YY)");
  224. puts("r   for time and date reporting, (R)everse order to time first");
  225. puts("    No options is the same as -dt:  MM/DD/YY hh:mm");
  226. puts("v   Version, Serial No., Copyright message");
  227. puts("?   You know this one already!");
  228. aabort(BELL);
  229.    }
  230.  
  231.